博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Flask_0x02 模板
阅读量:5235 次
发布时间:2019-06-14

本文共 5122 字,大约阅读时间需要 17 分钟。

0x1 Jinja2

  1.1 Jinja2模板引擎

    模板是包含响应文本的文件,其中包含用站位变量表示的动态部分

    templates/user.html

Hello, {
{ name }}!

    Flask提供render_template函数把Jinja2模板引擎集成到程序中

    渲染模板

from flask import Flask, render_template#...@app.route('/')def index():    return render_template('index.html')@app.route('/user/
')def user(name): return render_template('user.html', name=name)

    Jinja2能识别所有类型的变量

A value from a dictionary: {

{ mydict['key'] }}.

A value from a list: {

{ mylist[3] }}.

A value from a list,with a variable index: {

{ mylist[myintvar] }}.

A value from an object's method: {

{ myobj.somemethod() }}.

    可以使用过滤器修改变量

Hello,{
{ name|capitalize }}Jinjia2变量过滤器:http://jinja.pocoo.org/docs/2.9/templates/#builtin-filters safe 渲染值时不转义capitalize 首字母大写,其他小写lower 转换小写upper 转换大写title 把值中每个单词首字母转换成大写trim 去掉值的首尾空格striptags 渲染前把值中所有HTML标签删掉

  1.2 控制结构

{% if user %}    Hello, {
{ user }}{
% else %} Hello, Stranger!{
% endif %}
    {
    % for comment in comments %}
  • {
    { comment }}
  • {
    % endfor %}

    宏

{% macro render_comment(comment) %}    
  • {
    { comment }}
  • {
    % endmacro %}
      {
      % for comment in comments %} {
      { render_comment(comment) }}{
      % endfor %}

        重复使用宏,可以将其保存在单独的文件中

    {% import 'macros.html' as macros %}
      {
      % for comment in comments %} {
      { macros.render_comment(comment) }} {
      % endfor %}

        继承,先创建名为base.html的模板

        {% block head %}    {% block title %}{% endblock %} - MyApplication    {% endblock %}    {% block body %}    {% endblock %}

        block标签定义的元素可在衍生模板中修改

    {% extends "base.html" %}{% block title %}Index{% endblock %}{% block head %}    {
    { super() }} {% endblock %}{% block body %}

    Hello, World

    {% endblock %}

        使用super()获取原来模板中的内容

     

    0x2 Flask-Bootstrap & 错误页面

      2.1 Flask-Bootstrap

        git checkout 3b

        Bootstrap官方文档 http://getbootstrap.com/

    (venv) $ pip install flask-bootstrap

        初始化Flask-Bootstrap

    from flask.ext.bootstrap import Bootstrap#...bootstrap = Bootstrap(app)

        templates/user.html 使用Flask-Bootstrap的模板

    {% extends "bootstrap/base.html" %}{% block title %}Flasky{% endblock %}{% block navbar %}
    {% endblock %}{% block content %}
    {% endblock %}

    如果程序需要向已经有内容的块中添加新内容,必须使用Jinja2提供的super()函数

    如果要在衍生模板中添加新的js文件

    {% block scripts %}{
    { super() }}{% endblock %}

      2.2 错误页面

        git checkout 3c

    @app.errorhandler(404)def page_not_found(e):    return render_template('404.html'), 404@app.errorhandler(500)def internal_server_error(e):    return render_template('500.html'), 500

        templates/base.html

    {% extends "bootstrap/base.html" %}{% block title %}Flasky{% endblock %}{% block navbar %}
    {% endblock %}{% block content %}
    {% block page_content %}{% endblock %}
    {% endblock %}templates/404.html{% extends "base.html" %}{% block title %}Flasky - Page Not Found{% endblock %}{% block page_content %}
    {% endblock %}templates/user.html{% extends "base.html" %}{% block title %}Flasky{% endblock %}{% block page_content %}
    {% endblock %}
    View Code

    0x3 链接 & 静态文件 & Flask-Moment

      3.1 链接

            git checkout 3d

        Flask提供了url_for()可以使用程序URL映射中保存的信息生成URL

        使用url_for()生成动态地址时,将动态部分作为关键字参数传入

    url_for('user',name='john',_external=True)的返回结果是http://localhost:5000/user/john

        传入url_for()的关键字参数能将任何额外参数添加到查询字符串中

    url_for('index',page=2)的返回结果是/?page=2

      3.2 静态文件

        调用url_for('user',name='john',_external=True)的返回结果是http://xx/static/css/styles.css

        templates/base.html:定义收藏夹图标

    {% block head %}{
    { super() }}
    {% endblock %}

      3.3 Flask-Moment本地化日期和时间

        git checkout 3e

        学习moment.js提供的全部格式化选项:http://momentjs.com/docs/#/displaying

    (venv) $ pip install flask-moment

        初始化Flask-moment

    from flask.ext.moment import Momentmoment = Moment(app)

       templates/base.html:引入moment.js库

    {% block scripts %}{
    { super() }}{
    { moment.include_moment() }}{
    % endblock %}

       代码把变量current_time传入模板进行渲染

    from datetime import datetime@app.route('/')def index():    return render_template('index.html',current_time=datetime.utcnow())

        模板中渲染current_time

        templates/index.html:使用Flask-Moment渲染时间戳

    The local date and time is {

    { moment(current_time).format('LLL') }}.

    That was {

    { moment(current_time).fromNow(refresh=True) }}.

        format('LLL')根据客户端电脑中的时区和时域设置渲染日期时间,L到LLLL对应不同复杂度

        format() 还可以接受自定义格式说明符
        fromNow()渲染相对应时间戳,指定refresh后,其内容随时间推移而更新

        语言可在模板中选择,把语言代码传给lang()

    {
    { moment.lang('es') }}

     

    转载于:https://www.cnblogs.com/trojan-z/p/6341489.html

    你可能感兴趣的文章
    C# Dynamic通用反序列化Json类型并遍历属性比较
    查看>>
    auth模块
    查看>>
    javascript keycode大全
    查看>>
    前台freemark获取后台的值
    查看>>
    log4j.properties的作用
    查看>>
    游戏偶感
    查看>>
    Leetcode: Unique Binary Search Trees II
    查看>>
    C++ FFLIB 之FFDB: 使用 Mysql&Sqlite 实现CRUD
    查看>>
    Spring-hibernate整合
    查看>>
    c++ map
    查看>>
    exit和return的区别
    查看>>
    discuz 常用脚本格式化数据
    查看>>
    洛谷P2777
    查看>>
    PHPStorm2017设置字体与设置浏览器访问
    查看>>
    Django 相关
    查看>>
    git init
    查看>>
    训练记录
    查看>>
    IList和DataSet性能差别 转自 http://blog.csdn.net/ilovemsdn/article/details/2954335
    查看>>
    Hive教程(1)
    查看>>
    第16周总结
    查看>>